2017 多校训练题解1 [K.KazaQ's Socks] 思考
题目链接:有编号1~n的n双袜子,每天穿一双编号最小的,晚上扔到洗衣机里。当只剩一双袜子时就要洗了,第二天晚上洗完的袜子回归。问第k天穿的是哪双。
关键思想:注意了,当没有开始洗的时候,每天穿的就依次是1、2、3、n,而穿编号n的袜子的晚上,脏袜子洗好了回归(编号为n的袜子扔到洗衣机里),现在能穿的只有1~n-1。
依次穿1~n-2,然后穿n-1的时候,洗衣机里又有编号为1~n-2以及n一共n-1双袜子了又要开始洗。
次日,n-1被扔到洗衣机里,1~n-2以及n这些袜子回归。
依次穿1~n-2再穿n,最后一天晚上1~n-2和n-1这些袜子回归。
依次穿1~n-2再穿n-1,最后一天晚上1~n-2以及n这些袜子回归。
最后两步循环往复,因此有了以下代码
代码如下:
/* CopyRight GentleGamer */ #include <iostream> #include <cstdio> using namespace std; int main(){ long long n,k; int cnt=1; long long ans=0; while(scanf("%ld%ld",&n,&k)){ if(k<=n)ans=n;//k<=n是依次穿的。 else { k-=n;//考查后面的循环情况 long long tmp=k%(n-1);//我考虑的循环长度是n-1 if(tmp>0)ans=tmp;//没穿到只剩一双的时候,是依次来的 else{ if((k/(n-1))&1){//如果在奇数个串里 ans=n-1; }else ans=n; } } printf("Case #%ld: %ld\n",cnt++,ans); } return 0; }
边完善自己边认识自己